﻿Public Class TMyProcPrivilegesList
    Implements System.IDisposable

    Private _Owner As TMyUser
    Private _List As New List(Of TMyProcPrivileges)
    Public ReadOnly Property Host() As String
        Get
            Return _Owner.Host
        End Get
    End Property
    Public ReadOnly Property User() As String
        Get
            Return _Owner.UserName
        End Get
    End Property

    Public Sub New(ByVal AOwner As TMyUser)
        _Owner = AOwner
    End Sub
    Private ReadOnly Property Query() As TMyQuery
        Get
            Return _Owner.Query
        End Get
    End Property
    Default Public ReadOnly Property Items(ByVal Index As Integer) As TMyProcPrivileges
        Get
            Return _List(Index)
        End Get
    End Property

    Public ReadOnly Property Count() As Integer
        Get
            Return _List.Count
        End Get
    End Property

    Public Sub Refresh()
        _List.Clear()
        Query.Clear()
        Query.SQL.AppendLine("select")
        Query.SQL.AppendLine(" p.Host")
        Query.SQL.AppendLine(",p.Db")
        Query.SQL.AppendLine(",p.User")
        Query.SQL.AppendLine(",p.Routine_name")
        Query.SQL.AppendLine(",p.Routine_type")
        Query.SQL.AppendLine(",p.Grantor")
        Query.SQL.AppendLine(",p.Proc_priv")
        Query.SQL.AppendLine(",p.Timestamp")
        Query.SQL.AppendLine(",r.CREATED")
        Query.SQL.AppendLine(",r.LAST_ALTERED")
        Query.SQL.AppendLine(",r.ROUTINE_COMMENT")
        Query.SQL.AppendLine("from")
        Query.SQL.AppendLine("  mysql.procs_priv p")
        Query.SQL.AppendLine("inner join information_schema.routines r on(p.Db=r.routine_schema and p.Routine_name=r.routine_name and p.Routine_type=r.routine_type)")
        Query.SQL.AppendLine("where")
        Query.SQL.AppendLine("p.host=?host")
        Query.SQL.AppendLine("and p.user=?user")
        Query.SQL.AppendLine("order by")
        Query.SQL.AppendLine(" p.Host")
        Query.SQL.AppendLine(",p.Db")
        Query.SQL.AppendLine(",p.User")
        Query.SQL.AppendLine(",p.Routine_name")
        Query.SQL.AppendLine(",p.Routine_type")
        Query.DeclareAndSet("host", _Owner.Host)
        Query.DeclareAndSet("user", _Owner.UserName)
        Query.Execute()
        While Not Query.Eof
            Dim item As New TMyProcPrivileges
            item._Db = Query.FieldAsString("Db")
            item._RoutineName = Query.FieldAsString("Routine_name")
            item._RoutineType = Query.FieldAsString("Routine_type")
            item._Grantor = Query.FieldAsString("Grantor")
            item._ProcPriv = Query.FieldAsString("Proc_priv")
            item._Timestamp = Query.FieldAsDateTime("Timestamp")
            item._RoutineComment = Query.FieldAsString("routine_comment")
            item._Created = Query.FieldAsDateTime("created")
            item._LastAltered = Query.FieldAsDateTime("last_altered")
            _List.Add(item)
            Query.MoveNext()
        End While
        Query.Close()

    End Sub

    Private disposedValue As Boolean = False        ' 重複する呼び出しを検出するには

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO: 他の状態を解放します (マネージ オブジェクト)。
            End If
            _List.Clear()
            ' TODO: ユーザー独自の状態を解放します (アンマネージ オブジェクト)。
            ' TODO: 大きなフィールドを null に設定します。
        End If
        Me.disposedValue = True
    End Sub

#Region " IDisposable Support "
    ' このコードは、破棄可能なパターンを正しく実装できるように Visual Basic によって追加されました。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' このコードを変更しないでください。クリーンアップ コードを上の Dispose(ByVal disposing As Boolean) に記述します。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class
